<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>创建数据库集群</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="postgres-user.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="runtime.html">快退</a></td><td width="60%" align="center" valign="bottom">章16. 操作系统环境</td><td width="10%" align="right" valign="top"><a href="runtime.html">快进</a></td><td width="10%" align="right" valign="top"><a href="server-start.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="CREATING-CLUSTER">16.2. 创建数据库集群</a></h1><a name="AEN18728"></a><a name="AEN18730"></a>
<p>在做任何事情之前，必须先初始化磁盘上的数据存储区，叫作<i class="FIRSTTERM">数据库集群</i>(标准 SQL 术语称为"目录集群")。一个数据库集群是一系列数据库的集合，这些数据库可以通过单个数据库服务器的实例管理。在初始化后，一个数据库集群将包含一个叫 <tt class="LITERAL">postgres</tt> 的数据库，这个库是给工具、用户和第三方程序使用的缺省数据库。数据库服务器本身并不要求 <tt class="LITERAL">postgres</tt> 数据库的存在，但是很多外部工具假设它存在。另外一个在每个集群初始化过程中创建的数据库叫 <tt class="LITERAL">template1</tt> 。正如其名一样，这个数据库将作为随后创建的数据库的模版；在实际工作中不应该使用这个库(参阅<a href="managing-databases.html">章19</a>获取有关创建数据库的信息)。</p>
<p>用文件系统的术语来说，一个数据库集群是一个目录，所有数据都将存放在这个目录中。我们把它称做<i class="FIRSTTERM">数据目录</i>或<i class="FIRSTTERM">数据区</i>。在哪里存放数据完全取决于你的选择，我们没有缺省值，尽管 <tt class="FILENAME">/usr/local/pgsql/data</tt> 或 <tt class="FILENAME">/var/lib/pgsql/data</tt> 这样的目录很常用。要初始化一个数据库集群，可以使用 <a href="app-initdb.html">initdb</a> 命令，这个命令与 PostgreSQL 一起安装。你可以用 <tt class="OPTION">-D</tt> 选项指定数据目录的位置，例如：</p>
<pre class="SCREEN"><samp class="PROMPT">$</samp> <kbd class="USERINPUT">initdb -D /usr/local/pgsql/data</kbd></pre>
<p>你必须以 PostgreSQL 用户的身份来执行这条命令，这一点我们在前面一节描述过。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>作为 <tt class="OPTION">-D</tt> 选项的替代品，你还可以使用 <tt class="ENVAR">PGDATA</tt> 环境变量。</p>
</blockquote>
</div>
<p>如果你声明的路径还不存在，<tt class="COMMAND">initdb</tt> 将试图创建它。如果你按照我们的建议创建了一个非特权帐户的话，你很有可能缺少做这些事情的权限。这时，你可以自己创建该目录(以 root 身份)然后把该目录的所有权交给 PostgreSQL 用户或者赋与它写权限。下面是可能有效的方法：</p>
<pre class="SCREEN">root# <kbd class="USERINPUT">mkdir /usr/local/pgsql/data</kbd>
root# <kbd class="USERINPUT">chown postgres /usr/local/pgsql/data</kbd>
root# <kbd class="USERINPUT">su postgres</kbd>
postgres$ <kbd class="USERINPUT">initdb -D /usr/local/pgsql/data</kbd></pre>
<p>如果数据目录看起来像已经初始化过了，那么 <tt class="COMMAND">initdb</tt> 会拒绝运行。</p>
<p>因为数据目录包含所有存储在数据库里的数据，所以出于安全考虑，这个目录不能给任何非授权用户访问。因此，<tt class="COMMAND">initdb</tt> 禁止除 PostgreSQL 用户帐户以外的任何用户访问这个目录。</p>
<p>不过，因为目录的内容是安全的，所以缺省的客户端认证设置允许任意本地用户连接到数据库甚至成为超级用户。如果你不信任本地用户，我们建议你使用 <tt class="COMMAND">initdb</tt> 的 <tt class="OPTION">-W</tt>, <tt class="OPTION">--pwprompt</tt> 或 <tt class="OPTION">--pwfile</tt> 选项给超级用户赋予一个口令。还有，声明 <tt class="OPTION">-A md5</tt> 或 <tt class="OPTION">-A password</tt> ，这样就不会使用缺省的 <tt class="LITERAL">trust</tt> 身份认证。或者在执行 <tt class="COMMAND">initdb</tt> 之后，<span class="emphasis"><i class="EMPHASIS">第一次</i></span>启动服务器之前修改 <tt class="FILENAME">pg_hba.conf</tt> 文件。另外一些合理的方法包括 <tt class="LITERAL">ident</tt> 认证或者用文件系统权限禁止连接。参阅<a href="client-authentication.html">章20</a>获取更多细节。</p>
<p><tt class="COMMAND">initdb</tt> 同时也为数据库集群初始化缺省区域。通常，它将只是使用环境中的区域设置并且把它们应用于初始化的数据库。我们可以为数据库声明不同的区域；有关这些的更多信息可以在<a href="locale.html">节21.1</a>中找到。在特定数据库集群里的排序顺序是由 <tt class="COMMAND">initdb</tt> 设置的，而且以后就不能更改了(除非转储所有数据，重新运行 <tt class="COMMAND">initdb</tt> 并重新装载数据)。使用非 <tt class="LITERAL">C</tt> 或 <tt class="LITERAL">POSIX</tt> 的区域还会有性能影响。因此，第一次就选择正确很重要。</p>
<p><tt class="COMMAND">initdb</tt> 还为数据库集群设置缺省的字符集编码。通常这个应该选择与区域匹配。详见<a href="multibyte.html">节21.2</a>。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="postgres-user.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="server-start.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">PostgreSQL 用户帐户</td><td width="34%" align="center" valign="top"><a href="runtime.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">启动数据库服务器</td></tr>
</table>
</div>
</body></html>